// request.js
import axios from 'axios'
//import {Message, Loading} from 'element-ui';
import { ElMessage ,ElLoading } from 'element-plus'
import router from "../router";
// 创建axios实例
// 创建请求时可以用的配置选项

// 配后端数据的接收方式application/json;charset=UTF-8或者application/x-www-form-urlencoded;charset=UTF-8
const contentType = 'application/json;charset=UTF-8'

// 获取API地址：开发环境使用环境变量，生产环境使用配置文件
const getApiUrl = () => {
    // 开发环境：使用环境变量
    if (import.meta.env.DEV) {
        return import.meta.env.VITE_APP_BASE_API
    }
    
    // 生产环境：优先从配置文件读取，如果没有则使用环境变量
    if (window.APP_CONFIG && window.APP_CONFIG.API_BASE_URL) {
        return window.APP_CONFIG.API_BASE_URL
    }
    // 如果没有配置文件，则使用环境变量作为默认值
    return import.meta.env.VITE_APP_BASE_API
}

const apiUrl = getApiUrl()

//创建loading实列
let loadingInstance = undefined

const instance = axios.create({
    /**
     * 是否携带cookie,注意若携带cookie后端必须配置
     * 1.Access-Control-Allow-Origin为单一域名(具体到IP + port,用localhost貌似不行)
     * 2.需要带上响应头Access-Control-Allow-Credentials
     */
    // withCredentials: true,
    timeout: 60000,
    baseURL: apiUrl,
    headers: {
        'Content-Type': contentType
    }
})
// axios的全局配置
instance.defaults.headers.post = {
    'Content-Type': 'application/x-www-form-urlencoded'
}
instance.defaults.headers.common = {
    'X-Requested-With': 'XMLHttpRequest',
}
//instance.defaults.headers['Access-Control-Allow-Origin']='*'

// 添加请求拦截器(post只能接受字符串类型数据)
instance.interceptors.request.use(
    config => {
        if(config.loading === undefined || config.loading === true){
            loadingInstance = ElLoading.service({
                lock: false,
                text: '接口请求中...',
                background: 'rgb(0 120 212 / 28%)'
            })
        }
        const satoken = localStorage.getItem('satoken')
        if (satoken) {
            config.headers.satoken = satoken
        }
        return config
    },
    error => {
        if (loadingInstance) {
            loadingInstance.close()
        }
        return Promise.reject(error)
    }
)
const errorHandle = (status, other) => {
    switch (status) {
        case 400:
            ElMessage.error('信息校验失败')
            break
        case 401:
            // @ts-nocheck
            ElMessage.error('认证失败')
            break
        case 403:
            ElMessage.error('token校验失败')
            break
        case 404:
            ElMessage.error('请求的资源不存在')
            break
        default:
            ElMessage.error(other)
            break
    }
}

// 添加响应拦截器
instance.interceptors.response.use(
    // 响应包含以下信息data,status,statusText,headers,config
    res => {
        if (loadingInstance) {
            loadingInstance.close()
        }
      /*  if(res.data.code && res.data.code==='9999'){
            router.push('/sso-login?back=' + encodeURIComponent(window.location.href))
        }*/
        // 请求通用处理
        return res.data
    },
    err => {
        // Message.error(err)
        if (loadingInstance) {
            loadingInstance.close()
        }
        const { response } = err
        if (response) {
            errorHandle(response.status, response.data)
            return Promise.reject(response)
        }
        ElMessage.error('请求失败')
        return true
    }
)

export default instance
